package author

import (
	models "HeadLineNews/proto_models/manage/author_model"
	"HeadLineNews/resp"
	"github.com/gin-gonic/gin"
)

type Server interface {
	AddAuthorHandler(c *gin.Context)
	UpdateAuthorHandler(c *gin.Context)

	RetrieveAuthorHandler(c *gin.Context)
	ListAuthorHandler(c *gin.Context)

	DeleteAuthorHandler(c *gin.Context)
}

type server struct {
	ctx  Ctx
	repo Repo
}

func NewServer() Server {
	return &server{
		ctx:  NewCtx(),
		repo: NewRepo(),
	}
}

// AddAuthorHandler 新增作者
func (s *server) AddAuthorHandler(c *gin.Context) {
	// 1. 解析添加作者参数
	p, err := s.ctx.ParseParmAddAuthor(c)
	if err != nil {
		return
	}
	// 2. 检查唯一作者名
	if err = s.repo.CheckUniqueAuthorName(c, p.AuthorName); err != nil {
		return
	}
	// 3. 入库
	if err = s.repo.InsertAuthor(c, p); err != nil {
		return
	}
	resp.Success(c, nil) // 成功后可以让前端 get list
}

// UpdateAuthorHandler 更新作者
func (s *server) UpdateAuthorHandler(c *gin.Context) {
	// 1. 解析参数
	p, err := s.ctx.ParseParmUpdateAuthor(c)
	if err != nil {
		return
	}
	// 2. 根据 id 检查作者是否存在，返回原来的 authName
	var authorName string
	if authorName, err = s.repo.CheckAuthorExists(c, p.AuthorId); err != nil {
		return
	}
	// 3. 跟原来的名字不一样就要检查是不是存在重复
	if authorName != p.AuthorName {
		if err = s.repo.CheckUniqueAuthorName(c, p.AuthorName); err != nil {
			return
		}
	}
	// 4. 更新
	if err = s.repo.UpdateAuthor(c, p); err != nil {
		return
	}
	resp.Success(c, nil)
}

// RetrieveAuthorHandler 检索单条作者
func (s *server) RetrieveAuthorHandler(c *gin.Context) {
	p, err := s.repo.RetrieveAuthor(c)
	if err != nil {
		return
	}
	resp.Success(c, p)
}

// ListAuthorHandler 批量显示作者
func (s *server) ListAuthorHandler(c *gin.Context) {
	p, err := s.ctx.ParseParamListAuthor(c)
	if err != nil {
		return
	}
	var data *models.ResponseListAuthor
	if data, err = s.repo.ListAuthor(c, p); err != nil {
		return
	}
	resp.Success(c, data)
}

// DeleteAuthorHandler 删除单个作者
func (s *server) DeleteAuthorHandler(c *gin.Context) {
	if err := s.repo.DeleteAuthor(c); err != nil {
		return
	}
	resp.Success(c, nil)
}

